home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Deutsche Edition 1
/
Deutsche Edition 1.iso
/
amok
/
amok_lha
/
amok71.lha
/
AntiLinkVirus
/
AntiLinkVirus.mod
< prev
next >
Wrap
Text File
|
1993-08-15
|
15KB
|
453 lines
(**************************************************************************
:Program. AntiLinkVirus
:Contents. überprüft (erzeugt beim ersten Mal) eine Checksumme von
:Contents. dem Programm, an das AntiLinkVirus gelinkt wurde.
:Usage. IMPORT AntiLinkVirus;
:Copyright. frei kopierbar und benutzbar. Versionen in anderen Sprachen
:Copyright. sowie die freie Verwendung auch in kommerziellen Produkten
:Copyright. (was mich angeht) hiermit gestattet.
:Author. Thomas Ansorge
:Address. Dinkelackerring 55, W-6730 Neustadt, Deutschland
:Language. Modula-2
:Translator. M2Amiga V4.0 (deutsch)
:Imports. ReqSupport (Frank Zimmermann, AMOK#55, Copyright beachten!)
:Imports. Resident (Thomas Ansorge)
:Version. 1.0 vom 11. April 1992
:History. 1.0 vom 11. April 1992. erste funktionierende Version.
**************************************************************************)
(*$ LargeVars := FALSE *)
IMPLEMENTATION MODULE AntiLinkVirus;
FROM Arguments IMPORT GetArg;
FROM Arts IMPORT Error, returnVal, Terminate;
FROM FileSystem IMPORT Close, File, Lookup, ReadByteBlock, Response,
WriteByteBlock;
IMPORT R;
FROM ReqSupport IMPORT TwoGadRequest;
FROM Resident IMPORT cliStarted, FindResident;
FROM String IMPORT Concat, Copy;
FROM SYSTEM IMPORT ADR, ASSEMBLE, CAST;
(* --------------------------------------------------------------------- *)
CONST EOL = "\n";
CONST PosText = "Weiter ...\o";
NegText = "Abbrechen!\o";
CONST ALVText = "AntiLinkVirus:";
ChkText = "Die Checksumme stimmt nicht!";
FHunkText1 = "Hinter dem Programm ist (mind.) ein zusätzlicher Hunk!";
FHunkText2 = "Dieser zusätzliche Hunk hat hier nichts zu suchen!";
KeHunkText = "Ich kann meinen ALV-Hunk nicht finden!";
LaengeText = "Das Programm ist länger als im Directory eingetragen!";
LockText = "Fehler beim Lesen des Programms!\o";
UHTypText = "Hier ist ein mir unbekannter Hunktyp.";
KeALVText = "Bitte verzichten Sie auf AntiLinkVirus.\o";
LVirusText = "Möglicherweise hat sich ein Link-Virus bei Ihnen eingenistet!\o";
CONST FalscheChecksummeFehler = ALVText + EOL + ChkText + EOL + LVirusText;
FalscheLaengeFehler = ALVText + EOL + LaengeText + EOL + LVirusText;
FalscherHunkFehler = ALVText + EOL + FHunkText1 + EOL + FHunkText2 + EOL +
LVirusText;
KeinHunk = ALVText + EOL + KeHunkText + EOL + LVirusText;
KeinLock = ALVText + EOL + LockText;
UnbekannterHunkFehler = ALVText + EOL + UHTypText + EOL + KeALVText;
CONST HunkUnit = LONGINT (000003E7H);
HunkName = LONGINT (000003E8H);
HunkCode = LONGINT (000003E9H);
HunkData = LONGINT (000003EAH);
HunkBss = LONGINT (000003EBH);
HunkReloc32 = LONGINT (000003ECH);
HunkReloc16 = LONGINT (000003EDH);
HunkReloc8 = LONGINT (000003EEH);
HunkExt = LONGINT (000003EFH);
HunkSymbol = LONGINT (000003F0H);
HunkDebug = LONGINT (000003F1H);
HunkEnde = LONGINT (000003F2H);
HunkHeader = LONGINT (000003F3H);
HunkUnknown = LONGINT (000003F4H); (* habe ich nirgendwo gefunden *)
HunkOverlay = LONGINT (000003F5H);
HunkBreak = LONGINT (000003F6H);
HunkLaenge = LONGINT (7); (* 7 Langwörter *)
CONST ALV = CAST (LONGINT, "ALV ");
PIUS = CAST (LONGINT, "PIUS");
CONST FilePuffer = 11 * 1024; (* Bytes *)
CONST StringMax = 255;
LongStringMax = 511;
TYPE String = ARRAY [0..StringMax] OF CHAR;
LongString = ARRAY [0..LongStringMax] OF CHAR;
TYPE HunkCheck = RECORD
HCode1 : LONGINT;
HLaenge: LONGINT;
HName : LONGINT;
HAdd : LONGINT;
HEor : LONGINT;
PLaenge: LONGINT;
HCode2 : LONGINT;
END (* RECORD HunkCheck *);
(* Name und Pfad dieses Programms *)
VAR Datei : File;
FileName: String;
Gelesen : LONGINT;
Laenge : INTEGER;
ReqText : LongString;
(* zum Berechnen *)
VAR Ladeeinheiten: LONGINT;
DieserHunk : LONGINT;
Langwort : LONGINT;
(* der Check-Hunk *)
VAR CheckHunk : HunkCheck;
Jungfraeulich : BOOLEAN;
MeinHunkGelesen: BOOLEAN;
(* diverses *)
VAR i,
j : LONGINT;
(* --------------------------------------------------------------------- *)
PROCEDURE Check (Gelesen{R.D4}: LONGINT);
(* macht die eigentliche Berechnung *)
(* ------------------------------------------------------------------ *)
BEGIN (* Prozedur Check *)
ASSEMBLE (
ADD.L D4,CheckHunk.HAdd(A4)
EOR.L D4,CheckHunk.HEor(A4)
END); (* ASSEMBLE *)
END Check (* Prozedur *);
(* --------------------------------------------------------------------- *)
(* --------------------------------------------------------------------- *)
BEGIN (* IMPLEMENTATION MODULE AntiLinkVirus *)
alvEvent := ALVEventSet {};
Jungfraeulich := TRUE;
MeinHunkGelesen := FALSE;
GetArg (0, FileName, Laenge);
IF Laenge <= StringMax THEN
IF NOT (cliStarted AND (FindResident (FileName, FALSE) # NIL)) THEN
Lookup (Datei, FileName, FilePuffer, FALSE);
IF Datei.res = done THEN
CheckHunk.HCode1 := HunkName;
CheckHunk.HLaenge := (SIZE (CheckHunk) DIV 4) - 2;
CheckHunk.HName := ALV;
CheckHunk.HAdd := 0;
CheckHunk.HEor := 0;
CheckHunk.PLaenge := 0;
CheckHunk.HCode2 := HunkEnde;
ReadByteBlock (Datei, Langwort);
IF Langwort = HunkHeader THEN
Concat (FileName, " - ");
Check (Langwort);
INC (CheckHunk.PLaenge);
ReadByteBlock (Datei, Langwort);
Check (Langwort);
INC (CheckHunk.PLaenge);
ReadByteBlock (Datei, Langwort);
Check (Langwort);
INC (CheckHunk.PLaenge);
Ladeeinheiten := Langwort;
ReadByteBlock (Datei, Langwort);
Check (Langwort);
INC (CheckHunk.PLaenge);
ReadByteBlock (Datei, Langwort);
Check (Langwort);
INC (CheckHunk.PLaenge);
FOR i := 1 TO Ladeeinheiten DO
ReadByteBlock (Datei, Langwort);
Check (Langwort);
INC (CheckHunk.PLaenge);
END (* FOR i *);
(* alle Ladeeinheiten lesen *)
FOR i := 1 TO Ladeeinheiten DO
REPEAT
ReadByteBlock (Datei, Langwort);
Check (Langwort);
INC (CheckHunk.PLaenge);
(* die einzelnen Hunks der Ladeeinheiten *)
CASE Langwort OF
|HunkUnit,
HunkName,
HunkCode,
HunkData,
HunkHeader: ReadByteBlock (Datei, Langwort);
Check (Langwort);
INC (CheckHunk.PLaenge);
DieserHunk := Langwort;
FOR j := 1 TO DieserHunk DO
ReadByteBlock (Datei, Langwort);
Check (Langwort);
INC (CheckHunk.PLaenge);
END (* FOR j *);
|HunkBss : ReadByteBlock (Datei, Langwort);
Check (Langwort);
INC (CheckHunk.PLaenge);
|HunkReloc32,
HunkReloc16,
HunkReloc8 : REPEAT
ReadByteBlock (Datei, Langwort);
Check (Langwort);
INC (CheckHunk.PLaenge);
DieserHunk := Langwort; (* Anzahl d. Offsets *)
IF DieserHunk # 0 THEN
ReadByteBlock (Datei, Langwort);
Check (Langwort);
INC (CheckHunk.PLaenge);
FOR j := 1 TO DieserHunk DO
ReadByteBlock (Datei, Langwort);
Check (Langwort);
INC (CheckHunk.PLaenge);
END (* FOR j *);
END (* IF DieserHunk *);
UNTIL DieserHunk = 0;
|HunkEnde : (* nichts *)
ELSE (* CASE Langwort *)
(* unbekannter Hunk *)
Error (ADR (UHTypText), ADR (KeALVText));
END (* CASE Langwort *);
UNTIL Langwort = HunkEnde;
END (* FOR i *);
(* Ende des eigentlichen Programms. *)
LOOP
ReadByteBlock (Datei, Langwort);
IF NOT Datei.eof THEN
(* das sollte entweder VIRUSCONTROL oder AntiLinkVirus sein *)
Jungfraeulich := FALSE;
IF Langwort = HunkName THEN
ReadByteBlock (Datei, Langwort);
DieserHunk := Langwort;
ReadByteBlock (Datei, Langwort);
IF (Langwort = ALV) AND (DieserHunk = CheckHunk.HLaenge) THEN
(* mein Hunk! *)
MeinHunkGelesen := TRUE;
ReadByteBlock (Datei, Langwort);
IF Langwort # CheckHunk.HAdd THEN
INCL (alvEvent, alvCheckSum);
Copy (ReqText, FileName);
Concat (ReqText, FalscheChecksummeFehler);
IF TwoGadRequest (ReqText, NIL) = 0 THEN
returnVal := 21;
Terminate ();
ELSE (* IF NOT TwoGadRequest *);
(* EXIT (* LOOP *); *)
END (* IF NOT TwoGadRequest *);
END (* IF Langwort *);
ReadByteBlock (Datei, Langwort);
IF Langwort # CheckHunk.HEor THEN
INCL (alvEvent, alvCheckSum);
Copy (ReqText, FileName);
Concat (ReqText, FalscheChecksummeFehler);
IF TwoGadRequest (ReqText, NIL) = 0 THEN
returnVal := 21;
Terminate ();
ELSE (* IF NOT TwoGadRequest *);
(* EXIT (* LOOP *); *)
END (* IF NOT TwoGadRequest *);
END (* IF Langwort *);
ReadByteBlock (Datei, Langwort);
IF Langwort # CheckHunk.PLaenge THEN
INCL (alvEvent, alvLength);
Copy (ReqText, FileName);
Concat (ReqText, FalscheLaengeFehler);
IF TwoGadRequest (ReqText, NIL) = 0 THEN
returnVal := 21;
Terminate ();
ELSE (* IF NOT TwoGadRequest *);
(* EXIT (* LOOP *); *)
END (* IF NOT TwoGadRequest *);
END (* IF Langwort *);
ReadByteBlock (Datei, Langwort);
INC (CheckHunk.PLaenge, SIZE (CheckHunk) DIV 4);
ELSIF (Langwort = PIUS) AND (DieserHunk = 3) THEN
(* VIRUSCONTROL-Hunk *)
INCL (alvEvent, alvVirusControl);
INC (CheckHunk.PLaenge, 6);
ReadByteBlock (Datei, Langwort);
ReadByteBlock (Datei, Langwort);
ReadByteBlock (Datei, Langwort);
ReadByteBlock (Datei, Langwort);
ELSE (* unbekannter Hunk, der hier nichts zu suchen hat! *)
INCL (alvEvent, alvMoreHunks);
Copy (ReqText, FileName);
Concat (ReqText, FalscherHunkFehler);
IF TwoGadRequest (ReqText, NIL) = 0 THEN
returnVal := 21;
Terminate ();
ELSE (* IF NOT TwoGadRequest *);
(* EXIT (* LOOP *); *)
END (* IF NOT TwoGadRequest *);
END (* IF (Langwort = ALV) *);
ELSE (* IF Langwort = HunkName *)
INCL (alvEvent, alvMoreHunks);
IF Langwort = HunkCode THEN
Copy (ReqText, FileName);
Concat (ReqText, FalscherHunkFehler);
IF TwoGadRequest (ReqText, NIL) = 0 THEN
returnVal := 21;
Terminate ();
ELSE (* IF NOT TwoGadRequest *);
(* EXIT (* LOOP *); *)
END (* IF NOT TwoGadRequest *);
END (* IF Langwort *);
END (* IF Langwort = HunkName *);
ELSE (* IF NOT Datei.eof *);
IF NOT MeinHunkGelesen THEN
INCL (alvEvent, alvNoHunk);
Copy (ReqText, FileName);
Concat (ReqText, KeinHunk);
IF TwoGadRequest (ReqText, NIL) # 0 THEN
IF Jungfraeulich THEN
WriteByteBlock (Datei, CheckHunk);
EXIT (* LOOP *);
END (* IF Jungfraeulich *);
ELSE (* IF TwoGadRequest *)
returnVal := 21;
Terminate ();
END (* IF TwoGadRequest *);
END (* IF NOT MeinHunkGelesen *);
END (* IF NOT Datei.eof *);
IF Datei.eof THEN
EXIT (* LOOP *);
END (* IF Datei.eof *);
END (* LOOP *);
ELSE (* IF Langwort = HunkHeader *)
Error (ADR (UHTypText), ADR (KeALVText));
END (* IF Langwort *);
Close (Datei);
Datei.file := NIL;
END (* IF Datei.res *);
END (* IF NOT *);
END (* IF Laenge *);
(* --------------------------------------------------------------------- *)
CLOSE;
IF Datei.file # NIL THEN
Close (Datei);
Datei.file := NIL;
END (* IF Datei.file *);
END AntiLinkVirus (* Implementations-Modul *).